/*
 * @Author: wuqingchun
 * @Date: 2024-07-30 10:18:22
 * @Description: 小顶堆实现
 * @LastEditors: wuqingchun
 * @LastEditTime: 2024-07-30 20:01:47
 */
#ifndef __MIN_HEAP_H__
#define __MIN_HEAP_H__

#include <stddef.h>

/*
二叉堆本质上是一种完全二叉树，它分为两个类型。

最大堆：任何一个父节点的值，都大于或等于它左右孩子结点的值。
最小堆：任何一个父节点的值，都小于或等于它左右孩子结点的值。
*/

typedef int (*MINHEAP_CMP_NODE_PF)(void* pNode1, void* pNode2);

typedef struct tagMinHeap
{
    void** ppNodes;
    size_t ulCapacity;          // 空间大小
    size_t ulSize;              // 有效节点个数
    MINHEAP_CMP_NODE_PF pfCmp;  // 节点大小比较函数
}MIN_HEAP_S;

int MINHEAP_Init(MIN_HEAP_S* pstMinHeap, size_t ulInitCapacity, MINHEAP_CMP_NODE_PF pfCmp);
void MINHEAP_Fini(MIN_HEAP_S* pstMinHeap);
int MINHEAP_Push(MIN_HEAP_S* pstMinHeap, void* pNode);
void* MINHEAP_Pop(MIN_HEAP_S* pstMinHeap);

#endif //__MIN_HEAP_H__